package com.micro.modual.extension;

import com.micro.common.MicroConstant;
import com.micro.common.biz.GeneratorCodeUtil;
import com.micro.common.biz.TreeUtil;
import com.micro.common.util.SnowFlakeUtil;
import com.micro.modual.entity.SystemMenu;
import com.micro.modual.model.bo.systemmenu.SystemMenuBO;
import com.micro.modual.model.tree.MenuTreeDTO;
import com.micro.modual.model.tree.SystemMenuTreeDTO;
import org.apache.commons.collections.CollectionUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <h1>系统菜单表 延展类</h1>
 *
 * @author LevelCoder
 * @version V1.0.0
 * @email LevelCoder@126.com
 * @date 2020-08-04 00:23:26
 */
public class SystemMenuExtension {

    /**
     * <h2>转换: 系统菜单表 新增</h2>
     *
     * @param systemMenuBO {@link SystemMenuBO} 系统菜单表 新增/修改 请求对象
     * @return {@link SystemMenu} 系统菜单表
     */
    public static SystemMenu converAddSystemMenu(SystemMenuBO systemMenuBO) {
        SystemMenu systemMenu = new SystemMenu();
        systemMenu.setId(SnowFlakeUtil.getId());
        systemMenu.setMenuCode(GeneratorCodeUtil.generatorSystemCode());
        systemMenu.setAuthCode(systemMenuBO.getAuthCode());
        systemMenu.setMenuComponent(systemMenuBO.getMenuComponent());
        systemMenu.setMenuDesc(systemMenuBO.getMenuDesc());
        systemMenu.setMenuIcon(systemMenuBO.getMenuIcon());
        systemMenu.setMenuName(systemMenuBO.getMenuName());
        systemMenu.setMenuPath(systemMenuBO.getMenuPath());
        systemMenu.setMenuSort(systemMenuBO.getMenuSort());
        systemMenu.setMenuStatus(systemMenuBO.getMenuStatus());
        systemMenu.setMenuType(systemMenuBO.getMenuType());
        systemMenu.setMenuUrl(systemMenuBO.getMenuUrl());
        systemMenu.setParentCode(systemMenuBO.getParentCode());
        systemMenu.setCreateTime(new Date());
        return systemMenu;
    }

    /**
     * <h2>转换: 系统菜单表 修改</h2>
     *
     * @param systemMenuBO {@link SystemMenuBO} 系统菜单表 新增/修改 请求对象
     * @return {@link SystemMenu} 系统菜单表
     */
    public static SystemMenu converEditSystemMenu(SystemMenuBO systemMenuBO) {
        SystemMenu systemMenu = new SystemMenu();
        systemMenu.setId(systemMenuBO.getId());
        systemMenu.setMenuCode(GeneratorCodeUtil.generatorSystemCode());
        systemMenu.setAuthCode(systemMenuBO.getAuthCode());
        systemMenu.setMenuComponent(systemMenuBO.getMenuComponent());
        systemMenu.setMenuDesc(systemMenuBO.getMenuDesc());
        systemMenu.setMenuIcon(systemMenuBO.getMenuIcon());
        systemMenu.setMenuName(systemMenuBO.getMenuName());
        systemMenu.setMenuPath(systemMenuBO.getMenuPath());
        systemMenu.setMenuSort(systemMenuBO.getMenuSort());
        systemMenu.setMenuStatus(systemMenuBO.getMenuStatus());
        systemMenu.setMenuType(systemMenuBO.getMenuType());
        systemMenu.setMenuUrl(systemMenuBO.getMenuUrl());
        systemMenu.setParentCode(systemMenuBO.getParentCode());
        systemMenu.setCreateTime(new Date());
        return systemMenu;
    }

    /**
     * <h2>转换菜单对象</h2>
     * @param systemMenuList {@link SystemMenu}s  系统菜单表
     */
    public static List<SystemMenuTreeDTO> convertSystemMenuListDTO(List<SystemMenu> systemMenuList) {
        List<String> parentCodeArray = new ArrayList<>();
        List<SystemMenuTreeDTO> systemMenuListDTOList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(systemMenuList)){
            for(SystemMenu systemMenu:systemMenuList){
                SystemMenuTreeDTO systemMenuListDTO = new SystemMenuTreeDTO();
                systemMenuListDTO.setId(systemMenu.getId());
                systemMenuListDTO.setCode(systemMenu.getMenuCode());
                systemMenuListDTO.setAuthCode(systemMenu.getAuthCode());
                systemMenuListDTO.setCreateTime(systemMenu.getCreateTime());
                systemMenuListDTO.setMenuCode(systemMenu.getMenuCode());
                systemMenuListDTO.setMenuComponent(systemMenu.getMenuComponent());
                systemMenuListDTO.setMenuDesc(systemMenu.getMenuDesc());
                systemMenuListDTO.setMenuIcon(systemMenu.getMenuIcon());
                systemMenuListDTO.setMenuName(systemMenu.getMenuName());
                systemMenuListDTO.setMenuPath(systemMenu.getMenuPath());
                systemMenuListDTO.setMenuSort(systemMenu.getMenuSort());
                systemMenuListDTO.setMenuStatus(systemMenu.getMenuStatus());
                systemMenuListDTO.setMenuType(systemMenu.getMenuType());
                systemMenuListDTO.setMenuUrl(systemMenu.getMenuUrl());
                systemMenuListDTO.setParentCode(systemMenu.getParentCode());
                systemMenuListDTO.setUpdateTime(systemMenu.getUpdateTime());
                parentCodeArray.add(systemMenu.getParentCode());
                systemMenuListDTOList.add(systemMenuListDTO);
            }
        }
        if(parentCodeArray.contains(MicroConstant.SystemDefaultValue.DEFAULT_PARENT_CODE)){
            return TreeUtil.bulid(systemMenuListDTOList, MicroConstant.SystemDefaultValue.DEFAULT_PARENT_CODE);
        }else {
            return systemMenuListDTOList;
        }

    }

    /**
     * <h2>构建菜单树</h2>
     * @param menuList
     * @return
     */
    public static List<MenuTreeDTO> buildMenuTree(List<SystemMenu> menuList) {
        List<MenuTreeDTO> menuTreeList = new ArrayList<MenuTreeDTO>();
        for (SystemMenu menu : menuList) {
            MenuTreeDTO menuTree = new MenuTreeDTO();
            menuTree.setMenuId(String.valueOf(menu.getId()));
            menuTree.setCode(menu.getMenuCode());
            menuTree.setParentCode(menu.getParentCode());
            menuTree.setAuthCode(menu.getAuthCode());
            menuTree.setMenuIcon(menu.getMenuIcon());
            menuTree.setMenuName(menu.getMenuName());
            menuTree.setMenuType(menu.getMenuType());
            menuTree.setMenuComponent(menu.getMenuComponent());
            menuTree.setMenuUrl(menu.getMenuUrl());
            menuTree.setMenuCode(menu.getMenuCode());
            menuTreeList.add(menuTree);
        }
        return TreeUtil.bulid(menuTreeList, MicroConstant.SystemDefaultValue.DEFAULT_PARENT_CODE);

    }
}
